package list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
/**
 * Collection集合下 子集合[叫队列] 包位置:java.util
 * Queue 队列 单端队列
 * Deque 队列 双端队列 "Deque接口--继承--Queue接口"
 * 作用:保存数据,有序存储和处理,功能:数据缓冲或者多线程协调工作
 *
 * 队列实现类:
 * LinkedList:双向链表
 *
 */
public class QueueAPi {
    //Queue 队列 单端队列
    @Test
    public void testQueue(){
        //创建队列--多态--LINkedList
       Queue<String> queue=new LinkedList<>();
        /**
         * offer() ---add()一样
         * 作用:入队操作,队尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("冬眠");
        queue.offer("我的滑板鞋");
        queue.offer("体面");
        System.out.println("Queue队列:"+queue);
        /**
         *
         * 作用:出队操作:获取对首元素,并且删除队列中
         *
         */
        queue.poll(); queue.poll();
        System.out.println("Queue队列:"+queue);
        String str= queue.peek();
        System.out.println("队首元素:"+str);
        System.out.println("Queue队列:"+queue);
        /**
         * 需求:1.遍历队列--While--只遍历一次队列[队列元素消失]
         *  提示:while 条件:拿到队列中总长度 size()>0
         * 需求:2.遍历队列--增强for--队列元素不消失
         *  提示:for 条件:E e :队列
         *
         */
          while(queue.size()>0){//true:队列总数>0  队列有元素  遍历
              str=queue.poll();//获取对首 删除队列中对首
              System.out.println("获取队列元素:"+str);
          }
        System.out.println("Queue队列元素"+queue);

        /**
         * 需求:2.遍历队列--增强for--队列元素不消失
         *            提示:for 条件:E e :队列
         *
         */
        for(String e:queue){
            System.out.println("队列元素 :"+e);
        }
        System.out.println("Queue队列");
    }
    //Deuqe 队列 双端队列 --继承--单端队列
    @Test
    public void testDeque(){
        //创建Deque 双端队列 方法基本一致,部分方法不一致
        Deque<String> deque=new LinkedList<>();
        deque.offer("任贤齐");  deque.offer("王菲");
        deque.offer("毛阿敏");  deque.offer("那英");
        //offerFirst() 队首添加元素 offerLast() 队尾添加元素
        deque.offerFirst("蔡徐坤");   deque.offerFirst("薛之谦");
        System.out.println("双端队列[首尾添加元素]:"+deque);
        //
        System.out.println("获取队列中队首:"+deque.getFirst());
        System.out.println("获取队列中队尾:"+deque.getLast());
        //pollFirst() 获取队首 ,删除队列中队首
        //pollLast() 获取队尾 删除队列中对尾
       String xue= deque.pollLast();//删除
        System.out.println("队尾元素:"+xue);
        System.out.println("双端队列"+deque);
    }
    /**
     * 栈结构:业务中如果有后退[撤销]情况使用
     * 双端队列支持栈结构--提供相应的方法实现栈结构
     */
    @Test
    public void testStack(){
        //创建
        Deque <String> stack=new LinkedList<>();
        /**
         * push() Deque 独有的方法 --支持栈结构
         * --offer:Dueue---add:Colection接口 [添加]
         * 作用:[添加:往栈压入一个元素] 压栈操作
         *
         */
        stack.push("");
        stack.push("");
        stack.push("");
        stack.push("");
/**
 *
 */
String last= stack.pop();
System.out.println("出栈尾元素:"+last);
System.out.println("栈结构:"+stack);
//面试题: pop.poll.peek的使用区别
        /**
         * 需求1:遍历栈结构---while---元素出栈,队列元素需要清空
         *
         * 需求2:遍历栈结构---增强for---元素遍历成功,队列元素不变
         */
        while(stack.size()>0){
            String str =stack.pop();
            System.out.println("队列元素为"+str);
        }
        System.out.println("队列元素为"+stack);
        for (String str:stack){
            System.out.println("队列元素为"+str);
        }
        System.out.println("队列元素为"+stack);
    }
}
